package com.zhu.instructions.math;

// instructions/math/Drem.java
import com.zhu.instructions.base.NoOperandsInstruction;
import com.zhu.rtda.Frame;
import com.zhu.rtda.OperandStack;

/**
 * 指令：drem
 *
 * 操作数：无
 *
 * 功能：
 *  对栈顶两个 double 值进行求余运算：value1 % value2
 *
 * 栈变化：
 *      ..., value1, value2 → ..., result
 *
 * 特殊情况（IEEE 754）：
 *  - 如果 value2 == 0 或 value1 为无穷大，则结果为 NaN
 *  - 不会抛出 ArithmeticException
 *
 * 示例：
 *  double d = 5.5 % 0.0; // 结果为 NaN
 */
public class DREM extends NoOperandsInstruction {
    @Override
    public void execute(Frame frame) {
        OperandStack stack = frame.getOperandStack();
        double v2 = stack.popDouble(); // 除数
        double v1 = stack.popDouble(); // 被除数

        double result = v1 % v2; // IEEE 754 兼容
        stack.pushDouble(result);
    }
}
